package com.addcn.caruimodule.text;

import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;

import androidx.appcompat.widget.AppCompatEditText;



/**
 * author:LuWenbo
 * date: On 2019/3/1
 * content:号码分隔输入框
 * describe:
 */
public class SplitPhoneEditText extends AppCompatEditText {

    /**
     * 預設中國手機號碼長度
     */
    private int phoneLength = 10;
    /**
     * 定義手機號碼分割的位置，A為第一個空格分隔位置，B為第二個，C...依此類推
     *
     * 當前為 國內手機號 187 6543 2100
     */
    private int splitA = 4;
    private int splitB = 3;
    private int splitC = 0;

    /**
     * 當前號碼
     */
    private String phone = "";

    CurrentPhone currentPhoneListener;


    public SplitPhoneEditText(Context context) {
        this(context, null);
    }

    public SplitPhoneEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initSplitListener();
    }


    public void setCurrentPhoneListener(CurrentPhone currentPhoneListener) {
        this.currentPhoneListener = currentPhoneListener;
    }

    /**
     * 設定監聽器，實時改變字元間隔
     */
    private void initSplitListener() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int before, int count) {

                //這裡不要隨便寫一些程式碼，因為這裡會有一些程式和執行緒之間的初始化和互動，開始
                //這裡寫了一些東西，除錯發現的，最後就去了Handler和Looper，尤其是使用return就出錯了。
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (TextUtils.isEmpty(s) || s.length() == 0) return;
                //----------防止手動輸入空格越界---------------
                if (s.toString().substring(s.length() - 1).equals(" ")) {
                    setText(s.toString().trim());
                    setSelection(s.toString().trim().length());
                    return;
                }

                String ns = s.toString().replace(" ", "");

                //已經輸入設定長度的手機號
                if (ns.length() == phoneLength) {
                    return;
                } else {
                    //這裡測試過，當在輸入第spliteA+1 = a個數字和第spliteA + spliteB+2 = b個數字時，count瞬間變為a,b
                    //下面的ns.length() + count會大於phoneLength，其實並沒有，下面手動改變count數值。
                    count = 1;
                }

                //應對貼上情況
                if (ns.length() + count > phoneLength) {
//                    AlertDialog errorDialog = new AlertDialog.Builder(getContext()).create();
//                    errorDialog.setTitle("提示");
//                    errorDialog.setMessage("您輸入的手機");
//                    errorDialog.show();
//                    setText("");
                    return;
                }

                //下面是切割主要邏輯
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < s.length(); i++) {
                    if (splitC == 0) {
                        splitC = -1;
                    }
                    if (splitB == 0) {
                        splitB = -1;
                    }

                    //當前處於不應該切分的空格處，即應刪除空格
                    if (i != splitA && i != (splitA + splitB + 1) && i != (splitA + splitB + splitC + 2) && s.charAt(i) == ' ') {
                        continue;
                    } else {

                        //不應該刪除的位置，新增上字元，不論該字元是不是空格，這裡出現的空格是該迴圈中新增上的空格，
                        //使用者如果手動輸入空格，在上面通過trim()已經刪掉了
                        sb.append(s.charAt(i));

                        //如果新增至此字元長度等於該分段長度，分段長度：187 6543 2100該手機號分為前4位(187+" ")一段，前9位(187+" "+6543+" ")一段
                        //最後一個非空格字元前插入空格進行分割，所有空格分隔都由此處插入
                        if ((sb.length() == (splitA + 1) || sb.length() == (splitA + splitB + 2) || sb.length() == (splitA + splitB + splitC + 3)) && sb.charAt(sb.length() - 1) != ' ') {
                            sb.insert(sb.length() - 1, ' ');
                        }
                    }
                }
                try {
                    /**
                     * before為1是貼上替換的情況
                     */
                    if (!sb.toString().equals(s.toString())) {

                        int index = start + 1;

                        if (sb.charAt(start) == ' ') {
                            if (before == 0) {
                                index++;
                            } else {
                                index--;
                            }
                        } else {
                            if (before == 1) {
                                index--;
                            }
                        }
                        setText(sb.toString());
                        setSelection(index);
                    }
                } catch (IndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                //phone = getText().toString().replace(" ", "");
                phone = getText().toString();
                if(currentPhoneListener != null) {
                    currentPhoneListener.getCurrentPhone(phone);
                }
            }
        });
    }

    //回撥結果介面
    public interface CurrentPhone {
        void getCurrentPhone(String phone);
    }


    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public int getPhoneLength() {
        return phoneLength;
    }

    public void setPhoneLength(int phoneLength) {
        this.phoneLength = phoneLength;
    }

    public int getSplitA() {
        return splitA;
    }

    public void setSplitA(int splitA) {
        this.splitA = splitA;
    }

    public int getSplitB() {
        return splitB;
    }

    public void setSplitB(int splitB) {
        this.splitB = splitB;
    }

    public int getSplitC() {
        return splitC;
    }

    public void setSplitC(int splitC) {
        this.splitC = splitC;
    }

}
